package cn.tedu.reflection;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

//反射有注解的类，并new
public class Test2 {
    public static void main(String[] args) throws Exception {
        //3.解析注解 --框架完成！
        //利用反射，执行带注解的方法
        //1.获取Class对象
        Class c=Demo.class;
        //2.获取所有方法
            Method[] a=c.getMethods();
            //遍历数组，得到每个方法m
        for (Method m : a) {
            //获取方法上指定的注解(保证注解@Retention(RetentionPolicy.RUNTIME)运行时还有效)
            Contrller con= m.getAnnotation(Contrller.class);
        //3.判断，方法有没有注解
            if (con!=null){
           Object obj=c.newInstance();
        //4.只执行使用了注解的方法
           m.invoke(obj );
            }
        }
    }

}
//1.定义注解 --框架完成！
@Target(ElementType.METHOD)//注解可以出现在类上
@Retention(RetentionPolicy.RUNTIME)//注解可以存在的时间
@interface  Contrller{}


//2.使用注解 --重点！！
class Demo{
//    @Contrller--错误位置
    String name ="jack";
@Contrller
public void method(){
        System.out.println(123);
    }
@Contrller
public void method2(){
        System.out.println(321);
    }
}
